package com.dycong.common.IO.socket.BIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Created by dycong on 2017/3/23.
 */
public class ServerHandel implements Runnable {
    Logger log = LoggerFactory.getLogger(ServerHandel.class);
    private Socket socket;

    public ServerHandel(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream());) {
            StringBuffer result = new StringBuffer();
            String tmp = null;
            /**TODO 使用readLine()一定要注意：读入的数据要注意有/r或/n或/r/n没有数据时会阻塞，在数据流异常或断开时才会返回null使用socket之类的数据流时，
             *TODO 如果不指定buffer大小，则readLine()使用的buffer有8192个字符。在达到buffer大小之前，只有遇到"/r"、"/n"、"/r/n"才会返回。
             *TODO shutdownOutput()和 shutdownInput()另个方法，用来分别只关闭 Socket 的输出流和输入流，而不影响其对应的输入流和输出流，
             *TODO 那么我们便可以在客户端发送完数据后，调用 shutdownOutput()方法将套接字的输出流关闭，这样，服务端的 read()方法便会返回 -1，继续往下执行
             */
            while ((tmp = in.readLine()) != null) {
                result.append(tmp);
                tmp = null;
            }
            log.info("server receive message : " + result.toString());
            System.out.println("server receive message : " + result.toString()+Thread.currentThread());
            // TODO 因为Socket在write()数据之后就没有代码执行了，接下来就是执行finally代码块里的close(或者自动关闭：带资源的try块)方法了，所以不会引起客户端的读阻塞
            out.write("server receive message");
            out.flush();
        } catch (IOException e) {
            log.info("" + e);
            System.out.println(e);
        } finally {
            try {
                //TODO: 一定记得关闭资源
                socket.close();
            } catch (IOException e) {
                log.info("socket close error: " + e);
            }
            if (socket != null)
                socket = null;
        }
    }
}
